<?php

namespace  Procesos\Cargador\Organizacion;

use Procesos\Exception\Exception;

use Entidades\Organizacion\Organizacion,
	Entidades\Organizacion\Logica\UnidadLogica,
	Entidades\Organizacion\Fisica\UnidadFisica,
	Entidades\Organizacion\Logica\Rol,
	Entidades\Organizacion\Generales\Funcionalidad,
	Entidades\Organizacion\Generales\FuncionalidadCompleja;


class OrganizacionHandler extends BaseHandler {
	
	private $organizacion;
	
	private $estadoDelManejador = 1;
	
	/**
	 * @type UnidadLogica
	 */
	private $unidadesLogicas = array();
	
	private $unidadLogicaActual;
	
	private $funcionalidad = array();
	private $funcionalidadActual;
	
	private $funcionalidadCompleja = array();
	private $funcionalidadComplejaActual;
	
	private $unidadesFisicas = array();
	
	private $unidadFisicaMadre;
	
	private $unidadLogicaMadre;
	
	private $unidadFisicaActual;
	
	private $condicionError = false;
	

	// ----------------------------------------
	// Props Methods
	// ----------------------------------------	print $attributes['idUnico'];
	public function __construct() {
		$this->organizacion =  new Organizacion();
	}

	// ----------------------------------------
	// Handler Methods
	// ----------------------------------------

	public function getFuncionalidades(){
		return $this->funcionalidad;
	}
	
	public function getFuncionalidadesComplejas() {
		return $this->funcionalidadCompleja;
	}
	
	public function getCondicionError() {
		return $this->condicionError;
	}
	
	public function getOrganizacion() {
		return $this->organizacion;
	}
	
	public function getUnidadesLogicas() {
		return $this->unidadesLogicas;
	}
	
	public function getUnidadesFisicas() {
		return $this->unidadesFisicas;
	}
	

	private function organizacionBeg($parser, $tag, $attributes) {
		$organizacion = new Organizacion();
		$this->organizacion = $organizacion;
		$this->organizacion->setIDUnico($attributes['idUnico']);
		$this->estadoDelManejador = 1;
	}

	private function unidadLogicaBeg($parser, $tag, $attributes) {
		$this->unidadLogicaActual = new UnidadLogica();
		$this->unidadLogicaActual->setIdUnico($attributes['idUnico']);
		$this->estadoDelManejador = 2; 
		$this->unidadLogicaMadre = null;
	}


	private function unidadFisicaBeg($parser, $tag, $attributes) {
		$this->unidadFisicaActual = new UnidadFisica();
		$this->unidadFisicaActual->setIdUnico($attributes['idUnico']);
		$this->unidadFisicaMadre = null;
		$this->unidadLogicaMadre = null;
		$this->estadoDelManejador = 3;
		
	}
	
	private function funcionalidadBeg($parser, $tag, $attributes) {
		$this->funcionalidadActual = new Funcionalidad();
		$this->funcionalidadActual->setIdUnico($attributes['idUnico']);
		$this->funcionalidadActual->setNombre($attributes['nombre']);
		$this->funcionalidadActual->setTipo($attributes['tipo']);
		if(isset($this->funcionalidad[$this->funcionalidadActual->getIdUnico()])){
			new Exception("funcionalidad ya esta definida");
			$this->condicionError = true;
		}
		else {
			$this->funcionalidad[$this->funcionalidadActual->getIdUnico()] = $this->funcionalidadActual;
			$this->estadoDelManejador = 4;
		}		
	}
	
	private function funcionalidadComplejaBeg($parser, $tag, $attributes) {
		$this->funcionalidadComplejaActual = new FuncionalidadCompleja();
		$this->funcionalidadComplejaActual->setIdUnico($attributes['idUnico']);
		$this->funcionalidadComplejaActual->setNombre($attributes['nombre']);
		$this->funcionalidadComplejaActual->setTipo($attributes['tipo']);
		if(isset($this->funcionalidad[$this->funcionalidadComplejaActual->getIdUnico()])){
			new Exception("Funcionalidad compleja ya esta definida");
			$this->condicionError = false;
		}
		else {
			$this->funcionalidadCompleja[$this->funcionalidadComplejaActual->getIdUnico()] = $this->funcionalidadComplejaActual;
			$this->estadoDelManejador = 5;
		}		
	}	

	
	private function satisfaceFCEnd($parser, $tag) {
		$idFC = $this->text;
		if(isset($this->funcionalidadCompleja[$idFC])) {
			$funcionalidad = $this->funcionalidadCompleja[$idFC];
			$this->unidadLogicaActual->setFuncionalidadC($funcionalidad);
		}
		else {
			new Exception("la funcionalidad no existe " . $idFC);
			$this->condicionError = false;
		}
	}
	
	private function nombreEnd($parser,$tag) {
		switch ($this->estadoDelManejador){
			case 1 : 
				$this->organizacion->setNombre($this->text);
				break;
			case 2 :
				$this->unidadLogicaActual->setNombre($this->text);
				break;
			case 3 :
				$this->unidadFisicaActual->setNombre($this->text);
				break;
		}
	}
	
	private function unidadLogicaEnd($parser, $tag) {
		if($this->unidadLogicaMadre) {
			if(isset($this->unidadesLogicas[$this->unidadLogicaMadre])) {
				$this->unidadLogicaActual->setUnidadLogicaMadre($this->unidadesLogicas[$this->unidadLogicaMadre]);	
			}
			else {
				new Exception('La unidad logica madre no esta definida');
				$this->condicionError = true;
			}
		}
		if(isset($this->unidadesLogicas[$this->unidadLogicaActual->getIdUnico()])){
			new Exception('La unidad ya existe');
			$this->condicionError = true;
		}
		else {
			$this->unidadesLogicas[$this->unidadLogicaActual->getIdUnico()] = $this->unidadLogicaActual;
		}
	}
	
	private function unidadFisicaEnd($parser, $tag) {
		if($this->unidadLogicaMadre) {
			if(isset($this->unidadesLogicas[$this->unidadLogicaMadre])) {
				$this->unidadFisicaActual->setUnidadLogicaMadre($this->unidadesLogicas[$this->unidadLogicaMadre]);	
			}
			else {
				new Exception('La unidad logica madre no esta definida');
				$this->condicionError = true;
			}
		}
		
		if($this->unidadFisicaMadre) {
			if(isset($this->unidadesFisicas[$this->unidadFisicaMadre])) {
				$this->unidadFisicaActual->setUnidadFisicaMadre($this->unidadesFisiicas[$this->unidadFisicaMadre]);	
			}
			else {
				new Exception('La unidad fisica madre no esta definida');
				$this->condicionError = true;
			}
		}
		
		if(isset($this->unidadesFisicas[$this->unidadFisicaActual->getIdUnico()])){
			new Exception('La unidad ya existe');
			$this->condicionError = true;
		}
		else {
			$this->unidadesFisicas[$this->unidadFisicaActual->getIdUnico()] = $this->unidadFisicaActual;
		}
	}
	
	private function unidadLogicaMadreEnd($parser, $tag){
		$this->unidadLogicaMadre = $this->text;
	}
	
	private function textEnd($parser,$tag) {
		$this->valorActual = $this->text;
	}
	
	private function unidadFisicaMadreEnd($parser, $tag){
		$this->unidadFisicaMadre = $this->text;
	}
	
	private function direccionEnd($parser, $tag) {
		$this->organizacion->setDireccion($this->text);
	}

	// ----------------------------------------
	// BaseHandler Methods
	// ----------------------------------------

	public function startElement($parser, $tag, $attributes) {
		parent :: startElement($parser, $tag, $attributes);
		switch ($tag) {
			case 'organizacion' :
				$this->organizacionBeg($parser, $tag, $attributes);
				break;
			case 'funcionalidad' :
				$this->funcionalidadBeg($parser,$tag, $attributes);
				break;	
			case 'funcionalidadCompleja' :
				$this->funcionalidadComplejaBeg($parser, $tag, $attributes);
				break;
			case 'unidadLogica' :
				$this->unidadLogicaBeg($parser, $tag, $attributes);
				break;
			case 'unidadFisica' :
				$this->unidadFisicaBeg($parser, $tag, $attributes);
				break;
		}
	}

	public function endElement($parser, $tag) {
		parent :: endElement($parser, $tag);
		switch ($tag) {
			case 'satisfaceFC' :
				$this->satisfaceFCEnd($parser, $tag);
				break;
			case 'nombre' :
				$this->nombreEnd($parser, $tag);
				break;
			case 'text' :
				$this->textEnd($parser, $tag);
				break;
			case 'unidadLogica' :
				$this->unidadLogicaEnd($parser, $tag);
				break;
			case 'unidadFisica' :
				$this->unidadFisicaEnd($parser, $tag);
				break;
			case 'unidadLogicaMadre' :
				$this->unidadLogicaMadreEnd($parser, $tag);
				break;
			case 'direccion' :
				$this->direccionEnd($parser, $tag);
				break;
		}
	}


}
?>
